home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok42
/
ineyes
/
ineyes.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
7KB
|
305 lines
MODULE InEyes;
(************************************************************************)
(* *)
(* (c) Ingo Schütze, 1990 *)
(* Version 1.0 *)
(* *)
(************************************************************************)
(* *)
(* Ein Screen-Hack. *)
(* *)
(************************************************************************)
FROM Intuition IMPORT
NewWindow, OpenWindow, WindowPtr, CloseWindow, IDCMPFlagSet,
IDCMPFlags, WindowFlagSet, WindowFlags, wbenchScreen,
ScreenFlagSet, IntuiMessage, ScreenPtr;
FROM Arts IMPORT
TermProcedure, Assert;
FROM SYSTEM IMPORT
ADR, LONGSET, INLINE, ADDRESS;
FROM Exec IMPORT
GetMsg, ReplyMsg, WaitPort, SetSignal, AllocMem, MemReqSet, MemReqs,
FreeMem, FindTask, SetTaskPri;
FROM Graphics IMPORT
RastPortPtr, SetDrMd, jam1, SetAPen, SetRGB4, ViewPortPtr, GetRGB4,
LoadRGB4,
SimpleSprite, GetSprite, MoveSprite, FreeSprite,
AreaEllipse, TmpRas, AreaInfo, InitArea, InitTmpRas, AreaEnd,
AllocRaster, FreeRaster;
FROM GfxMacros IMPORT
RasSize, SetAfPen;
TYPE
CardPtr = POINTER TO CARDINAL;
CONST
xml = 25; (* x-Mittelpunkt linkes Auge *)
yml = 35; (* y- *)
xmr = 75; (* x-MP rechtes Auge *)
ymr = 35; (* y *)
SpriteSize = 40;
VAR
InWindow : WindowPtr;
InWinDat : NewWindow;
Message : POINTER TO IntuiMessage;
class : IDCMPFlagSet;
InRastPort : RastPortPtr;
WBScreen : ScreenPtr;
VPort : ViewPortPtr;
InSprite1, InSprite2 : SimpleSprite;
ChipSprite1, ChipSprite2 : CardPtr;
s1, s2 : INTEGER;
xmlk, ymlk, xmrk, ymrk : INTEGER;
mx, my : INTEGER;
IP : INTEGER;
oldColors : ARRAY[0..19] OF CARDINAL;
PROCEDURE CleanUp;
BEGIN
IF InWindow#NIL THEN
CloseWindow(InWindow);
InWindow:=NIL;
END;
IF (s1=1) OR (s2=1) THEN
LoadRGB4(VPort,ADR(oldColors),20);
END;
IF s1#-1 THEN
FreeMem(ChipSprite1, SpriteSize);
FreeSprite(s1);
END;
IF s2#-1 THEN
FreeMem(ChipSprite2, SpriteSize);
FreeSprite(s2);
END;
END CleanUp;
PROCEDURE ChipCopy(source : CardPtr; VAR dest : CardPtr; size : LONGCARD);
VAR
ChipPtr : CardPtr;
copied : LONGCARD;
BEGIN
ChipPtr:=AllocMem(size, MemReqSet{chip});
dest:=ChipPtr;
copied:=0;
REPEAT
ChipPtr^ := source^ ;
INC(ChipPtr,2); INC(source,2); INC(copied,2);
UNTIL copied=size;
END ChipCopy;
PROCEDURE Koo;
VAR le, te : INTEGER;
BEGIN
le:=InWindow^.leftEdge;
te:=InWindow^.topEdge;
mx:=WBScreen^.mouseX;
my:=WBScreen^.mouseY;
xmlk:=le + xml - 25 + 10*(mx-le+xml) DIV 600;
ymlk:=te + yml - 6 + 10*(my-te+yml) DIV 200;
xmrk:=le + xmr - 25 + 10*(mx-le+xmr) DIV 600;
ymrk:=te + ymr - 6 + 10*(my-te+ymr) DIV 200;
END Koo;
PROCEDURE SpriteDaten; (* $E- *)
BEGIN
INLINE(00000H,00000H);
INLINE(0003CH,00000H);
INLINE(0007EH,00000H);
INLINE(000E7H,00018H);
INLINE(000DBH,0003CH);
INLINE(000DBH,0003CH);
INLINE(000E7H,00018H);
INLINE(0007EH,00000H);
INLINE(0003CH,00000H);
INLINE(00000H,00000H);
END SpriteDaten;
PROCEDURE InstallSprites;
VAR i : INTEGER;
s3 : INTEGER;
BEGIN
Koo;s3:=10;
ChipSprite1:=NIL;
ChipCopy(ADR(SpriteDaten),ChipSprite1,SpriteSize);
WITH InSprite1 DO
posctldata:=ChipSprite1;
height:=8;
x:=xmlk;
y:=ymlk;
num:=6;
END;
s1:=GetSprite(ADR(InSprite1),-1);
IF s1<2 THEN
s3:=s1;
s1:=GetSprite(ADR(InSprite1),-1);
END;
CASE s1 OF
| 2,3 :
SetRGB4(VPort,20,0,0,0);
SetRGB4(VPort,21,0,0,15);
SetRGB4(VPort,22,0,0,0);
SetRGB4(VPort,23,0,0,0);
| 4,5 :
SetRGB4(VPort,24,0,0,0);
SetRGB4(VPort,25,0,0,15);
SetRGB4(VPort,26,0,0,0);
SetRGB4(VPort,27,0,0,0);
| 6,7 :
SetRGB4(VPort,28,0,0,0);
SetRGB4(VPort,29,0,0,15);
SetRGB4(VPort,30,0,0,0);
SetRGB4(VPort,31,0,0,0);
ELSE
END;
ChipSprite2:=NIL;
ChipCopy(ADR(SpriteDaten),ChipSprite2,SpriteSize);
WITH InSprite2 DO
posctldata:=ChipSprite2;
height:=8;
x:=xmrk;
y:=ymrk;
num:=7;
END;
s2:=GetSprite(ADR(InSprite2),-1);
CASE s2 OF
| 2,3 :
SetRGB4(VPort,20,0,0,0);
SetRGB4(VPort,21,0,0,15);
SetRGB4(VPort,22,0,0,0);
SetRGB4(VPort,23,0,0,0);
| 4,5 :
SetRGB4(VPort,24,0,0,0);
SetRGB4(VPort,25,0,0,15);
SetRGB4(VPort,26,0,0,0);
SetRGB4(VPort,27,0,0,0);
| 6,7 :
SetRGB4(VPort,28,0,0,0);
SetRGB4(VPort,29,0,0,15);
SetRGB4(VPort,30,0,0,0);
SetRGB4(VPort,31,0,0,0);
ELSE
END;
IF s3<2 THEN
FreeSprite(s3);
END;
Assert((s1#-1)OR(s2#-1),ADR("Kann kein Sprite mehr darstellen!"));
END InstallSprites;
PROCEDURE OpWin;
BEGIN
WITH InWinDat DO
leftEdge:=50;
topEdge:=50;
width:=100;
height:=60;
detailPen:=0;
blockPen:=1;
idcmpFlags:=IDCMPFlagSet{closeWindow};
flags:=WindowFlagSet{windowDrag,windowClose,reportMouse,activate};
firstGadget:=NIL;
checkMark:=NIL;
title:=ADR("InEyes");
bitMap:=NIL;
minWidth:=50;
minHeight:=60;
maxWidth:=50;
maxHeight:=60;
type:=ScreenFlagSet{wbenchScreen};
END;
InWindow:=OpenWindow(InWinDat);
Assert(InWindow#NIL,ADR("Kann kein Window öffnen!"));
InRastPort:=InWindow^.rPort;
WBScreen:=InWindow^.wScreen;
Assert(WBScreen#NIL,ADR("Kriege keinen WBScreen!"));
VPort:=ADR(WBScreen^.viewPort);
END OpWin;
PROCEDURE FuellData; (* $E- *)
BEGIN
INLINE(0FFFFH);
INLINE(0FFFFH);
INLINE(0FFFFH);
INLINE(0FFFFH);
END FuellData;
PROCEDURE DrawElls;
VAR
Memory : ADDRESS;
InTmpRas : TmpRas;
InAreaInfo : AreaInfo;
Buffer : ARRAY[0..249] OF CARDINAL;
ok : BOOLEAN;
BEGIN
Memory:=AllocRaster(640,256);
InitArea(InAreaInfo,ADR(Buffer),100);
InitTmpRas(InTmpRas,Memory,RasSize(640,256));
InRastPort^.tmpRas:=ADR(InTmpRas);
InRastPort^.areaInfo:=ADR(InAreaInfo);
SetDrMd(InRastPort,jam1);
SetAPen(InRastPort,3);
SetAfPen(InRastPort,ADR(FuellData),2);
ok:=AreaEllipse(InRastPort, xml, yml, 20, 20);
ok:=AreaEllipse(InRastPort, xmr, ymr, 20, 20);
ok:=AreaEnd(InRastPort);
FreeRaster(Memory,640,256);
END DrawElls;
PROCEDURE DrawEyes;
BEGIN
Koo;
MoveSprite(VPort, ADR(InSprite1), xmlk, ymlk);
MoveSprite(VPort, ADR(InSprite2), xmrk, ymrk);
END DrawEyes;
BEGIN
IP:=SetTaskPri(FindTask(NIL), -50);
TermProcedure(CleanUp);
OpWin;
SetDrMd(InRastPort, jam1);
DrawElls;
InstallSprites;
DrawEyes;
LOOP
WHILE NOT (InWindow^.userPort^.sigBit IN SetSignal(LONGSET{},LONGSET{}) ) DO
DrawEyes;
END;
WaitPort(InWindow^.userPort);
Message:=GetMsg(InWindow^.userPort);
class:=Message^.class;
ReplyMsg(Message);
IF (closeWindow IN class) THEN EXIT; END;
END;
END InEyes.